import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from matplotlib.patches import Wedge
from datetime import datetime

# ---------------------- 1. 路径与样式 ----------------------
ROOT_DIR = r"D:\大三上\大数据分析及数据可视化\《Excel数据可视化 - 从图表到数据大屏》-清华-郭宏远\实验"
DATA_PATH = os.path.join(ROOT_DIR, "erp_order_data.xlsx")
RESULTS_DIR = os.path.join(ROOT_DIR, "results")
os.makedirs(RESULTS_DIR, exist_ok=True)
SAVE_PATH = os.path.join(RESULTS_DIR, "16_玉玦图.png")

plt.rcParams.update({
    'font.sans-serif': ['SimHei'],
    'axes.unicode_minus': False,
    'axes.facecolor': '#1A1A2E',
    'text.color': 'white',
    'axes.labelcolor': 'white',
    'xtick.color': 'white',
    'ytick.color': 'white',
    'figure.facecolor': '#1A1A2E'
})

# ---------------------- 2. 读取并处理电商订单数据 ----------------------
try:
    df = pd.read_excel(DATA_PATH)
    print(f"✓ 数据加载成功: {DATA_PATH}")
except Exception as e:
    print(f"数据加载失败: {e}")
    # 使用模拟数据
    labels = ['广东省', '江苏省', '四川省', '上海市', '陕西省', '湖北省']
    share = [0.375, 0.292, 0.208, 0.125, 0.186, 0.245]
    current_date = datetime.now().strftime('%Y-%m-%d')
else:
    # 确保订单时间是datetime类型
    if 'order_time' in df.columns:
        df['order_time'] = pd.to_datetime(df['order_time'])
        latest_date = df['order_time'].max()
        current_date = latest_date.strftime('%Y-%m-%d')
    else:
        current_date = datetime.now().strftime('%Y-%m-%d')

    # 按省份计算订单完成率
    if 'province' in df.columns and 'status' in df.columns:
        # 将"已完成"和"已发货"视为完成
        df['is_completed'] = df['status'].apply(lambda x: 1 if x in ['已完成', '已发货'] else 0)

        # 按省份计算完成率
        province_completion = df.groupby('province')['is_completed'].mean().sort_values(ascending=False)

        # 只保留完成率最高的前6个省份
        province_completion = province_completion.head(6)

        labels = province_completion.index.tolist()
        share = province_completion.values.tolist()
    else:
        # 数据不完整，使用默认值
        labels = ['广东省', '江苏省', '四川省', '上海市', '陕西省', '湖北省']
        share = [0.375, 0.292, 0.208, 0.125, 0.186, 0.245]

# 确保数据有效性
if len(labels) != len(share) or len(labels) < 2:
    labels = ['广东省', '江苏省', '四川省', '上海市', '陕西省', '湖北省']
    share = [0.375, 0.292, 0.208, 0.125, 0.186, 0.245]

# 构造"占位"：确保每个扇形总和不超过50%（180度）
# 对于玉玦图，我们希望显示完成率，剩余部分显示为灰色
placeholder = [0.5 - s if s < 0.5 else 0 for s in share]

# ---------------------- 3. 绘制玉玦图（所有弧线从同一半径、同一角度开始） ----------------------
fig, ax = plt.subplots(figsize=(14, 9))
ax.set_aspect('equal')

# 颜色：从深到浅的蓝色系
colors = ['#E56A72', '#FFB94F', '#4BB5C2', '#5C1E2B', '#2C3E50', '#8A2D3D']

# 定义所有圆环的内半径和宽度
inner_radius = 0.5  # 所有圆环的内半径相同
width = 0.1  # 每个圆环的宽度

# 从内到外绘制每层弧
for i in range(min(len(labels), len(colors))):
    if i >= len(share):
        break

    # 所有圆环的起始角度都是180°，结束角度根据各自的占比计算
    start_angle = 180
    end_angle = start_angle + share[i] * 360  # 360度圆

    # 绘制圆弧（宽度固定）
    wedge = Wedge(
        center=(0, 0),
        r=inner_radius + i * width,  # 外半径 = 内半径 + 层数 * 宽度
        theta1=start_angle,
        theta2=end_angle,
        width=width,
        facecolor=colors[i],
        edgecolor='#E0E0E0',
        linewidth=1.5
    )
    ax.add_patch(wedge)

    # 添加标签（沿弧中点向外偏移）
    mid_angle = (start_angle + end_angle) / 2
    x = (inner_radius + i * width + width / 2) * np.cos(np.deg2rad(mid_angle))
    y = (inner_radius + i * width + width / 2) * np.sin(np.deg2rad(mid_angle))
    ha = 'left' if x >= 0 else 'right'

    # 添加省份和完成率标签
    ax.text(x * 1.15, y * 1.15, f"{labels[i]}\n({share[i]:.0%})",
            fontsize=12, fontweight='bold', ha=ha, va='center', color='white')

# 标题
ax.set_title(f'2025年上半年省份订单完成率分布', fontsize=20, fontweight='bold', pad=25,
             color='white')
ax.text(0.5, 0.92, f'截至{current_date}，各省份订单完成情况',
        ha='center', va='center', transform=ax.transAxes,
        fontsize=16, color='#E0E0E0')

# 中心文字
ax.text(0, 0, '订单完成率',
        ha='center', va='center', fontsize=16, color='white', fontweight='bold')

# 隐藏坐标轴
ax.set_xlim(-1.1, 1.1)
ax.set_ylim(-1.1, 1.1)
ax.axis('off')

# 底部数据来源
ax.text(0.5, 0.02, '*注：数据来源于公司销售系统',
        ha='center', va='bottom', transform=ax.transAxes,
        fontsize=10, color='#B0B0B0', alpha=0.7)

# 保存
plt.tight_layout(rect=[0, 0.05, 1, 0.95])
plt.savefig(SAVE_PATH, dpi=300, bbox_inches='tight', facecolor='#1A1A2E')
plt.show()

# 数据分析
print("✅ 玉玦图（使用电商订单数据）生成成功！")
print(f"📁 保存路径：{SAVE_PATH}")
print("\n玉玦图数据分析：")
for i in range(min(len(labels), len(share))):
    print(f"- {labels[i]}: {share[i]:.1%} 订单完成率")